#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *reverse(char *str)
{
  /**
   * 返回【逆序】的字符串
   */
}

// - 1、求和：从两个字符串的【末尾】往前开始逐位相加
// - 2、逆序：
char* addStrings(char* num1, char* num2)
{
  int len_num1 = strlen(num1);
  int len_num2 = strlen(num2);

  int len = (len_num1 > len_num2 ? len_num1 : len_num2) + 2; // +1 是末尾 '\0', 再 +1 是 '1' + '9' = '10' 多一位
  char* ret = (char*)malloc(sizeof(char) * len);
  memset(ret, '\0', len);

  int carry = 0; // 进位值（满10进位1）
  int i = len_num1 - 1; // 末尾一个字符
  int j = len_num2 - 1; // 末尾一个字符
  int k = 0;
  while(i >= 0 || j >= 0 || carry != 0) // 不能大于2个字符串的长度 && num1[i]+num2[j] > 10 产生进位
  {
    // 1、carry = num1[i] + num2[j]
    if(i>=0)
      carry += num1[(i--)] - '0';

    if(j>=0)
      carry += num2[(j--)] - '0';

    // 2、存储 carry%10 得到的【当前位】
    // 注意：存储字符的顺序，与最终的数字排列的顺序【相反】，所以需要【逆序】
    ret[k++] = carry % 10 + '0';

    // 3、carry/10 得到【进位】
    carry /= 10;
  }

  /**
         "11111"
      +   "3456"
      ----------
         "13457" => [7,5,4,3,1] => 反转 => [1,3,4,5,7]
   */
  return reverse(ret);
}

int main(int argc, char const *argv[])
{
  char* str = addStrings("0","0");
  return 0;
}
